package com.swift.violent.mainstay.config;

import cn.hutool.core.collection.ListUtil;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.BeetlTemplateEngine;

/**
 * 生成核心代码
 * The type My batis generator configuration.
 *
 * @author xuhaifeng
 * @since 2021.01.22
 */
public class MyBatisPlusGenConfig {

    /**
     * The entry point of application.
     *
     * @param args the input arguments
     */
    public static void main(String[] args) {
        final AutoGenerator mpg = new AutoGenerator();
        /* 全局配置 */
        final String projectPath = System.getProperty("user.dir");
        mpg.setGlobalConfig(new GlobalConfig()
                //是否打开输出目录 默认值:true
                .setOpen(false)
                //开启 swagger2 模式 默认false
                .setSwagger2(false)
                //是否覆蓋已有文件 默认值：false
                .setFileOverride(false)
                //开启 BaseResultMap 默认false
                .setBaseResultMap(true)
                //开启 baseColumnList 默认false
                .setBaseColumnList(true)
                //实体命名方式  默认值：null 例如：%sEntity 生成 UserEntity
                .setEntityName("%sEntity")
                //mapper 命名方式 默认值：null 例如：%sDao 生成 UserDao
                .setMapperName("%sMapper")
                //Mapper xml 命名方式   默认值：null 例如：%sDao 生成 UserDao.xml
                .setXmlName("%sMapper")
                //service 命名方式   默认值：null 例如：%sBusiness 生成 UserBusiness
                .setServiceName("%sService")
                //service impl 命名方式  默认值：null 例如：%sBusinessImpl 生成 UserBusinessImpl
                .setServiceImplName("%sServiceImpl")
                //controller 命名方式    默认值：null 例如：%sAction 生成 UserAction
                .setControllerName("%sController")
                .setAuthor("xuhaifeng")
                .setIdType(IdType.ASSIGN_UUID)
                .setDateType(DateType.ONLY_DATE)
                .setOutputDir(projectPath + "/swift-violent-core/src/main/java"));
        /* 数据源配置 */
        mpg.setDataSource(new DataSourceConfig()
                .setUsername("root")
                .setPassword("123456")
                .setDbType(DbType.MYSQL)
                .setDriverName("com.mysql.jdbc.Driver")
                .setUrl("jdbc:mysql://localhost:3308/swift_violent?useUnicode=true&serverTimezone=UTC&characterEncoding=utf-8"));
        /* 包配置 */
        mpg.setPackageInfo(new PackageConfig()
                .setModuleName("base")
                .setEntity("core.modal.po")
                .setService("core.service")
                .setController("controller")
                .setMapper("core.dao.mapper")
                .setXml("core.dao.mapper.xml")
                .setServiceImpl("core.service.impl")
                .setParent("com.swift.violent.mainstay.core"));
        /* 自定义xml配置 */
        final InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
            }
        }.setFileOutConfigList(ListUtil.toLinkedList(new FileOutConfig("/templates/mapper.xml.btl") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                return String.format("%s/swift-violent-core/src/main/resources/mapper/%s/%sMapper%s", projectPath, mpg.getPackageInfo().getModuleName(), tableInfo.getEntityName(), StringPool.DOT_XML);
            }
        }));
        mpg.setCfg(cfg);
        /* 配置模板 */
        mpg.setTemplate(new TemplateConfig());
        /* 策略配置 */
        mpg.setStrategy(new StrategyConfig()
                .setChainModel(true)
                .setEnableSqlFilter(true)
                .setEntityLombokModel(true)
                .setRestControllerStyle(true)
                .setEntityColumnConstant(true)
                .setLogicDeleteFieldName("validity")
                .setControllerMappingHyphenStyle(true)
                .setEntityTableFieldAnnotationEnable(true)
                .setNaming(NamingStrategy.underline_to_camel)
                .setColumnNaming(NamingStrategy.underline_to_camel)
                .setTablePrefix(mpg.getPackageInfo().getModuleName() + "_")
                .setInclude("api_user"))
                .setTemplateEngine(new BeetlTemplateEngine());
        mpg.execute();
    }
}
